#include "arith.h"

int 
arith_max(int x, int y) {
	return x > y ? x : y;
}

int 
arith_min(int x, int y) {
	return x < y ? x : y;
}

/*
C 语言标准只是强调，如果 x/y 是可表示的，那么 (x/y)*y + x%y 必须等于 x 。
当一个操作数为负数时，这种语义使得整数除法可以向零舍入，也可以向负无穷大舍入。例如，
如果 -13/5 的结果为 -2 那么 -13%5 = -13 - (-13/5)*5 = -13 - (-2)*5 = -3 。
如果 -13/5 的结果为 -3 那么 -13%5 = -13 - (-3)*5 = 2 。

arith_div(x, y) 定义为不超过实数 z 的最大整数，而 z*y = x 。因此，对于 x = -13 和 y = 5 或者
x = 13 和 y = -5 计算出 z 为 -2.6 因此 arith_div(-13, 5) 为 -3 。而 arith_mod(x, y) 定义为等于
x - y*arith_div(x, y) 因此 arith_mod(-13, 5) 为 -13 - 5*(-3) = 2 。 
**/
int 
arith_div(int x, int y) {
	// -13/5 == -2 依赖于编译器计算表达式值，来判断结果是否向 0 舍入。
	if (-13/5 == -2 && (x>0) != (y>0) && x%y != 0)
		return x / y - 1;
	else
		return x / y;
}

int 
arith_mod(int x, int y) {
	if (-13/5 == -2 && (x>0) != (y>0) && x%y != 0)
		return x%y + y; // 由 arith_mod 推倒而来
	else
		return x%y;	
}

/*
arith_ceiling 不小于返回实数商的最小整数，而 arith_floor 返回不大于实数商的最大整数。
**/
int 
arith_ceiling(int x, int y) {
	return arith_div(x, y) + (x%y != 0);
}

int 
arith_floor(int x, int y) {
	return arith_div(x, y);
}
